/*
给定一个含有 n 个正整数的数组和一个正整数 target ，找出该数组中满足其和 ≥ target 的长度最小的 连续子数组，并返回其长度。如果不存在符合条件的子数组，返回 0。
*/


/*

 先定义了两个指针 start 和 end，以及用于存储当前窗口内元素和的变量 sum。然后，通过一个循环，不断向右移动 end 指针，扩大窗口，直到窗口内的元素和大于等于 target。接着，开始缩小窗口，即向右移动 start 指针，直到窗口内的元素和小于 target。在这个过程中，每次缩小窗口时，都会更新满足条件的最小窗口大小 ans。最后，如果 ans 仍然是其初始值 INT_MAX，说明没有找到满足条件的子数组，返回 0；否则，返回 ans。

*/

#include <iostream>
#include <vector>
#include <climits>

int minSubArrayLen(int target, std::vector<int>& nums){
    int n = nums.size();
    int ans = INT_MAX;
    int start = 0;
    int sum = 0; //累加值

    for(int end = 0; end < n; end++) {
        sum += nums[end]; 

        while(sum >= target) {
           ans = std::min(ans, end - start + 1);
           sum -= nums[start];
           start++;   
       }
    }
     
     return ans == INT_MAX ? 0 : ans;	
}

int main(){
    std::vector<int> vec{1, 4, 7, 9, 3, 2, 7, 5};
    std::cout << "最小子数组长度： "  <<  minSubArrayLen(14, vec) << std::endl;
}

